package com.gch.programa.dao;

import com.gch.programa.modelo.Programa;
import com.gch.programa.modelo.TipoBusqueda;
import com.gch.programa.util.GCH;
import com.gch.programa.util.PersistenceUtil;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

/**
 *
 * @author grupoPrograma
 */
public class ProgramaDaoImplJPA implements ProgramaDao {

    //private static ArrayList<Programa> progr = new ArrayList<Programa>();
    private static EntityManagerFactory emf;
    private static final Logger logger = Logger.getLogger(ProgramaDaoImplJPA.class.getName());

    @Override
    public Programa consultarPorCodigo(final String codigo) {
        EntityManager em = PersistenceUtil.getEmf().createEntityManager();
        TypedQuery<Programa> emquery = em.createQuery("SELECT p FROM  Programa p WHERE p.codigo = :codigo", Programa.class);
        emquery.setParameter("codigo", codigo);

        try {
            Programa p = emquery.getSingleResult();
            em.close();
            return p;

        } catch (NonUniqueResultException nure) {
            Programa p = emquery.getResultList().get(0);
            em.close();
            GCH.dump("Dao:consultarPorCodigo", "existe más de uno, retornando el primero");
            return p;
        } catch (NoResultException e) {
            em.close();
            GCH.dump("Dao:consultarPorCodigo", "no exite este programa");
            return null;
        }
    }

    @Override
    public void registrar(Programa programa) {
        EntityManager em = PersistenceUtil.getEmf().createEntityManager();
        em.getTransaction().begin();
        em.persist(programa);
        em.getTransaction().commit();
        em.close();
    }

    @Override
    public List<Programa> listarTodos() {
        EntityManager em = PersistenceUtil.getEmf().createEntityManager();
        Query emquery = em.createQuery("SELECT p FROM  Programa p");
        List<Programa> programas = emquery.getResultList();
        em.close();
        return programas;
    }

    @Override
    public void eliminarPorCodigo(String codigo) {
        EntityManager em = PersistenceUtil.getEmf().createEntityManager();
        em.getTransaction().begin();
        Query emquery = em.createQuery("DELETE FROM Programa p WHERE p.codigo = :codigo");
        emquery.setParameter("codigo", codigo);
        emquery.executeUpdate();
        em.getTransaction().commit();
        em.close();
    }

    @Override
    public void borrarTodos() {
        EntityManager em = PersistenceUtil.getEmf().createEntityManager();
        em.getTransaction().begin();
        Query emquery = em.createQuery("DELETE FROM Programa p");
        emquery.executeUpdate();
        em.getTransaction().commit();
        em.close();
    }

    @Override
    public List<Programa> listarSegun(String titulo, String descripcion, TipoBusqueda tipoBusquedaEnum) {

        List<Programa> resultado = new LinkedList<Programa>();

        for (Programa programa : listarTodos()) {
            switch (tipoBusquedaEnum) {
                case Completa:
                    resultado.add(programa);
                    break;
                case Parcial:
                    if (!titulo.isEmpty() && titulo.equalsIgnoreCase(programa.getTitulo())
                            || !descripcion.isEmpty() && descripcion.equalsIgnoreCase(programa.getDescripcion())) {
                        resultado.add(programa);
                    }
                    break;
            }
        }
        return resultado;
    }

    @Override
    public void modificarPorCodigo(Programa uptedPrograma) {
        EntityManager em = PersistenceUtil.getEmf().createEntityManager();
        TypedQuery<Programa> emquery = em.createQuery("SELECT p FROM Programa p WHERE p.codigo = :codigo",Programa.class);
        emquery.setParameter("codigo", uptedPrograma.getCodigo());
        Programa programa = emquery.getSingleResult();
        programa.setTitulo(uptedPrograma.getTitulo());
        programa.setDescripcion(uptedPrograma.getDescripcion());
        programa.setObjetivos(uptedPrograma.getObjetivos());
        programa.setRequisitos(uptedPrograma.getRequisitos());
        programa.setMoneda(uptedPrograma.getMoneda());
        programa.setPrecio(uptedPrograma.getPrecio());
        programa.setDuracion(uptedPrograma.getDuracion());
        programa.setFechaInicial(uptedPrograma.getFechaInicial());
        em.getTransaction().begin();
        em.merge(programa);
        em.getTransaction().commit();
        em.close();
    }
}
